package pokeronlab_2014;

import java.io.IOException;
import java.util.HashMap;
import java.util.prefs.InvalidPreferencesFormatException;
import javax.xml.parsers.*;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

/**
 * Konfigurációkat menedzselő singleton osztály
 * 
 * @author András
 * 
 */
public class ConfigManager {
	/**
	 * A betöltött konfigurációt tároló map.
	 */
	private HashMap<String, String> values;

	private static ConfigManager instance;
	private static ConfigManager MCTS;
	private static ConfigManager C_value;
	private static ConfigManager hatvany;
	
	/**
	 * Default konstruktor, létrehozza a mapet.
	 */
	private ConfigManager() {
		try {
			loadConfig("agentDefaultConfig.xml");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * Visszaadja a példányt az osztályból
	 * 
	 * @return A singleton példány
	 */
	public static ConfigManager getInstance(){
		if(instance == null){
			instance = new ConfigManager();
		}
		return instance;
	}
	
	public static ConfigManager gethatvany(){
		if(hatvany == null){
			hatvany = new ConfigManager();
		}
		return hatvany;
	}
	
	
	public static ConfigManager getMCTS(){
		if(MCTS == null){
			MCTS = new ConfigManager();
		}
		return MCTS;
	}
	
	public static ConfigManager getC(){
		if(C_value == null){
			C_value = new ConfigManager();
		}
		return C_value;
	}

	/**
	 * @param name
	 *            A kiválasztott beállítás neve
	 * @return A kiválasztott beállítás értéke
	 * @throws InvalidPreferencesFormatException
	 *             Ha nem található az adott beállítás
	 */
	public String getValue(String name)
			throws InvalidPreferencesFormatException {
		String value = values.get(name.toLowerCase());
		if (value == null) {
			throw new InvalidPreferencesFormatException("");
		}
		return value;
	}

	/**
	 * @param name
	 *            A beállítandó tulajdonság neve
	 * @param value
	 *            A beállítandó tulajdonság értéke
	 */
	public void setValue(String name, String value) {
		values.put(name.toLowerCase(), value);
	}

	/**
	 * Beolvas egy XML formában tárolt konfigurációt
	 * 
	 * @param fileName
	 *            A beolvasott configot tartalmazó XML-fájl
	 * @throws IOException 
	 */
	public void loadConfig(String fileName) throws IOException{
		//létrehozunk egy hashmapot
		HashMap<String, String> retMap = new HashMap<String, String>();
		//XML beolvasó példányosítása után Dokumentum objekum létrehozása
		try {
			Document inputConfig = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().parse(fileName);
			//config nevű elementek lekérése
			NodeList list  = inputConfig.getElementsByTagName("config");
			//attribútumok lekérése, és tárolása
			for(int i = 0; i < list.getLength(); i++){
			//az elem első attribútumának nevét kulcsnak használva az értékét
			//tároljuk
				retMap.put(list.item(i).getAttributes().item(0).getNodeName().toLowerCase(),
						list.item(i).getAttributes().item(0).getNodeValue());
			}
			values = retMap;
		} catch (SAXException e) {
			//igényes hibakezelés egyébként
			throw new IOException();
		}
		 catch (ParserConfigurationException e) {
			throw new IOException();
		}
		
	}
}
